package com.kkb.spring.factory.support;

import com.kkb.spring.factory.BeanFactory;
import com.kkb.spring.ioc.BeanDefinition;
import com.kkb.spring.registry.DefaultSingletonBeanRegistry;

/**
 * 完成共性部分，其他功能由子类去完成
 */
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {
    @Override
    public Object getBean(String beanName) {
        // 1.首先从singletonObjects集合中获取对应beanName的实例
        Object singletonObject = getSingleton(beanName);
        // 2.如果有值，则直接返回
        if (singletonObject != null){
            return singletonObject;
        }
        // 3.如果没有，则获取对应的BeanDefinition信息
        BeanDefinition beanDefinition = getBeanDefinition(beanName);
        if (beanDefinition == null) {
            return null;
        }

        if (beanDefinition.isSingleton()){
            singletonObject = createBean(beanDefinition) ;
            addSingleton(beanName,singletonObject);
        }else if(beanDefinition.isPrototype()){
            singletonObject = createBean(beanDefinition) ;
        }
        // 5.单例流程中，需要将创建出来的Bean放入singletonObjects集合中
        // 6.如果是多例，走多例的创建Bean流程

        return singletonObject;
    }
    //需要延迟到DefaultListableBeanFactory去实现
    public abstract Object createBean(BeanDefinition bd);
    //需要延迟到AbstractAutowaredCapableBeanFactory去实现
    public abstract BeanDefinition getBeanDefinition(String beanName);
}
